package com.easycoding.framework.repository.support.query;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;

/**
 * 查询对象
 *
 */
public class QueryInfo<T> {
	
	/**
	 * 返回的结果集
	 */
	private List<T> result;
	/**
	 * 每页的大小，如果为0则这个查询不进行分页
	 */
	private int pageSize = 0;
	/**
	 * 从哪一页记录开始
	 */
	private int pageNo = 1;
	
	/**
	 * 总页数
	 */
	private int totalPage = 0;
	
	/**
	 * 总记录数
	 */
	private long total = 0;
	
	/**
	 * 当前页记录数
	 */
	private int current = 0;
	
	/**
	 * 查询规则
	 */
	private List<Criteria> criterias = new ArrayList<Criteria>();
	
	/**
	 * 排序
	 * String要排序的字段名，Direction排序方式
	 */
	Map<String, Direction> orderBy = new LinkedHashMap<String, Direction>();
	
	public QueryInfo(){
		
	}
	
	/**
	 * 增加查询规则
	 * @param queryParam
	 */
	public void where(Criteria criteria){
		this.criterias.add(criteria);
	}
	
	/**
	 * 去除查询条件
	 */
	public void removeCriteria(Criteria criteria){
		this.criterias.remove(criteria);
	}
	
	

	/**
	 * 增加排序的功能，默认倒序
	 * @param field
	 */
	public void addOrder(String field){
		orderBy.put(field, Direction.DESC);
	}
	
	
	/**
	 * 增加排序的功能，此方法为正序
	 * @param field
	 */
	public void addAscOrder(String field){
		orderBy.put(field, Sort.Direction.ASC);
	}
	
	/**
	 * 增加排序的功能，此方法为倒序
	 * @param field
	 */
	public void addDescOrder(String field){
		orderBy.put(field, Direction.DESC);
	}
	
	
	/**
	 * 清除查询规则和返回的值
	 */
	public void clear(){
		clearCriterias();
		clearOrderBy();
		this.result = null;
		this.totalPage = 0;
		this.total = 0;
		this.current = 0;
	}
	
	/**
	 * 清除查询规则
	 */
	public void clearCriterias() {
		criterias.clear();
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 获取从哪一页记录开始
	 * @return pageNo 从哪一页记录开始
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * 设置从哪一页记录开始
	 * @param pageNo 从哪一页记录开始
	 */
	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	public List<T> getResult() {
		return result;
	}

	public void setResult(List<T> result) {
		this.result = result;
	}

	protected Map<String, Direction> getOrderBy() {
		return orderBy;
	}
	
	/**
	 * 清空排序规则
	 */
	public void clearOrderBy(){
		this.orderBy.clear();
	}


	/**
	 * 获取总页数
	 * @return totalPage 总页数
	 */
	public int getTotalPage() {
		return totalPage;
	}

	/**
	 * 设置总页数
	 * @param totalPage 总页数
	 */
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}


	/**
	 * 获取总记录数
	 * @return total 总记录数
	 */
	public long getTotal() {
		return total;
	}

	/**
	 * 设置总记录数
	 * @param total 总记录数
	 */
	public void setTotal(long total) {
		this.total = total;
	}

	/**
	 * 获取当前页记录数
	 * @return current 当前页记录数
	 */
	public int getCurrent() {
		return current;
	}

	/**
	 * 设置当前页记录数
	 * @param current 当前页记录数
	 */
	public void setCurrent(int current) {
		this.current = current;
	}
	
	/**
	 * 获取查询规则
	 * @return criterias 查询规则
	 */
	public List<Criteria> getCriterias() {
		return criterias;
	}

	/**
	 * 设置查询规则
	 * @param criterias 查询规则
	 */
	public void setCriterias(List<Criteria> criterias) {
		this.criterias = criterias;
	}

}
